Flutter 地图<;字符串,动态>;在不预先知道数据的情况下,将其复制到任何类型的地图
我有一个来自服务器的json响应,格式如下Flutter 地图<;字符串,动态>;在不预先知道数据的情况下,将其复制到任何类型的地图,flutter,dart,Flutter,Dart,我有一个来自服务器的json响应,格式如下 { key1: { subKey1: value1 subKey2: value2 [...] }, key2: { [...] }, [...] } 我得到的所有答案都建议使用fromJson(…)的预定义模型类直接映射到PODOs 然而,这个JSON是用于翻译字符串的,而且非常庞大。顶级键是语言代码,但它们可以有数百个条目,而次级键也有数百个条目,它们的名称可能随时更改,等等 有没
{
key1: {
subKey1: value1
subKey2: value2
[...]
},
key2: {
[...]
},
[...]
}
我得到的所有答案都建议使用fromJson(…)的预定义模型类直接映射到PODOs
然而,这个JSON是用于翻译字符串的,而且非常庞大。顶级键是语言代码,但它们可以有数百个条目,而次级键也有数百个条目,它们的名称可能随时更改,等等
有没有一种简单的方法可以从jsonDecode(response.body)给我的Map转到Map
我试过了
Map<String, Map<String, String> typedMap = jsonResponse.map((key, value) => MapEntry(key, value))
由于您确信它们总是字符串,因此可以使用
value.toString()
Map映射条目(key,value.toString())
问题
您在大部分情况下使用了jsonResponse.map
,这是正确的,只是您误解了map回调返回的内容
jsonResponse.map((key, value) => MapEntry(key, value)
这是您的顶级键。它会像“键1”,“键2”一样改变键
这是钥匙前面的地图。这就是它的本质:值
//Dart正在将此解析为映射
{
子键1:值1,
子键2:值2
}
解决方案
您只需使用as
关键字将Map
转换为Map
Map result=jsonResponse.Map(
(键,值)=>MapEntry(键,值作为映射)
);
更新 可以使用这两种方法中的任何一种进行铸造
映射。从
,其中T1和T2是您的目标类型:
MapEntry(键,映射自(值))
Map.castFrom
,其中S1和S2是源类型,T1和T2是目标类型:
MapEntry(键,Map.castFrom(值))
print(${jsonResponse.runtimeType});
打印(${result.runtimeType});
这是它打印的
JsLinkedHashMap<String, dynamic> //<-- jsonResponse
JsLinkedHashMap<String, Map<String, String>> //<-- result
JsLinkedHashMap//这可能源于我的一个误解,我太习惯于Javascript,它可以直接读取JSON,不需要事先将其显式转换为已知属性的接口
因此,我决定采取不同的做法。我曾经基于一个简化的数据集获取锅炉板代码,然后将已知属性添加到锅炉板中。添加属性时,它们将直接添加到对象结构中
虽然不是最优的,但我们不想为此付出太多。感谢您的快速响应。但是,我在尝试在播放后访问它时遇到此错误。。。发生异常_CastError(类型“\u InternalLinkedHashMap”不是类型转换中类型“Map”的子类型)有什么想法吗?这意味着我们需要将映射嵌套到更深的一层\u InternalLinkedHashMap
转换为Map
。那么,在按键输入上也映射吗?老实说,我很困惑。我以前在各种环境中多次处理过JSON,但这让我陷入了一个循环…。toString()
将把submap转换成字符串,而不是映射
。因此,强制转换错误。检查我的答案是否正确我理解你的解释,对我来说这似乎很合乎逻辑。然而,在尝试之后,我仍然遇到了一个输入错误,现在与地图。。。我已经用最新的进度编辑了原稿。有没有可能给你提供更多的背景/想法?非常感谢。检查更新的答案@ALX450有趣的是我知道你说的有道理。它应该不会引起问题,但是,当使用这两种方法强制转换MapEntry值时,我得到了相同的错误,即。。。MapEntry(key,Map.from(value))无法将参数类型“dynamic”分配给参数类型“Map”,我开始感到恼火。。。就一点点…:D谢谢你的努力@aLx450您能在前面打印jsonResponse的值吗?映射并用输出更新问题。我想看看它能装什么。
{
"en":{
"title":"Title English",
"label_search":"Search",
"label_profile":"Profile",
"label_dashboard":"Dashboard"
},
"fr":{
"title":"Title French",
"label_search":"Recherche",
"label_profile":"Profil",
"label_dashboard":"Tableau de bord"
}
}
Map<String, Map<String, String> typedMap = jsonResponse.map((key, value) => MapEntry(key, value.toString()))
jsonResponse.map((key, value) => MapEntry(key, value)
JsLinkedHashMap<String, dynamic> //<-- jsonResponse
JsLinkedHashMap<String, Map<String, String>> //<-- result