Dart - 如何 _InternalLinkedHashMap<String, dynamic> 转换为 Map<String, dynamic>?

Fet*_*mos 37 json dart flutter

我在我的颤振应用程序中使用包 dio。从我的 api 问题中得到回应。 response.data获取类型 _InternalLinkedHashMap<String, dynamic>。我需要将此值转换为Map<String, dynamic>. 我尝试了很多选择,但这不起作用。

我无法更改服务器响应。有什么建议吗?

die*_*per 76

尝试这个:

Map<String, dynamic>.from(yourData)
Run Code Online (Sandbox Code Playgroud)

  • 这可行,但它不应该是必要的并且是浪费的。 (8认同)
  • @StuckInPhD 您的示例使用不同的参数化类型,因此需要进行转换。当参数化类型相同时,如原始问题所示,转换会创建不必要的副本,从而造成浪费。 (3认同)
  • 我从 Java 端获取一张地图发送到 dart 端,我必须执行“Map&lt;String,dynamic&gt;.from(call.arguments as Map&lt;Object?, Object?&gt;”。 (3认同)
  • 从函数返回“Map”时并不浪费。返回 ``_InternalLinkedHashMap`` 代替 ``Map`` 会出现错误:``无法从方法 'predict' 返回类型为 'LinkedHashMap&lt;dynamic,dynamic&gt;' 的值,因为它有一个返回类型'Future&lt;Map&lt;String,dynamic&gt;&gt;'.`` 使用 ``Map&lt;String,dynamic&gt;.from(yourData)`` 允许此返回。 (2认同)

jam*_*lin 15

您不需要在_InternalLinkedHashMap<K, V>and之间进行任何转换Map<K, V>:前者已经是后者的子类型。

void main() async {
  final map = <String, int>{};
  print(map.runtimeType);
  print('${map is Map<String, int>}');
}
Run Code Online (Sandbox Code Playgroud)

印刷:

_InternalLinkedHashMap<String, int>
true
Run Code Online (Sandbox Code Playgroud)

Map的默认构造函数是一个工厂构造函数,它构造了一个LinkedHashMapLinkedHashMap的默认构造函数也是一个工厂构造函数,Dart VM 的实现构造并返回了一个内部_InternalLinkedHashMap对象。)


请注意,这仅在_InternalLinkedHashMap<K, V>使用相同KV作为时才成立Map。如果它们在参数不同的类型,那么你将需要执行一个显式的转换,但是这不是这种情况在问这个问题

  • 如果这是真的,我们就不会收到错误。 (5认同)

Abd*_*air 6

我是如何做到的,我使用以下方法将 _InternalLinkedHashMap<dynamic,dynamic> 转换为 HashMap

var map = HashMap.from(value) // value is _InternalLinkedHashMap <dynamic, dynamic>
Run Code Online (Sandbox Code Playgroud)

从这里我可以获得类方法将地图转换为我的对象,以便我可以在代码中使用它,如下所示

User.fromJson(map) //  this return User object 
Run Code Online (Sandbox Code Playgroud)

您可以使用此网站直接从 JSON 生成 Dart 模型类。

以下是 User.Json 方法的代码片段:

SeatBookingModel.fromJson(Map<String, dynamic> json) {
userName= json['userName'];
userEmail= json['userEmail'];
 }
Run Code Online (Sandbox Code Playgroud)

快乐编码


Fre*_*ond 5

如果您的对象比一层更深,请尝试此操作:

final Map<String, dynamic> convertedData = jsonDecode(jsonEncode(yourData));
Run Code Online (Sandbox Code Playgroud)