Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 地图<;字符串,动态>;在不预先知道数据的情况下,将其复制到任何类型的地图_Flutter_Dart - Fatal编程技术网

Flutter 地图<;字符串,动态>;在不预先知道数据的情况下,将其复制到任何类型的地图

Flutter 地图<;字符串,动态>;在不预先知道数据的情况下,将其复制到任何类型的地图,flutter,dart,Flutter,Dart,我有一个来自服务器的json响应,格式如下 { key1: { subKey1: value1 subKey2: value2 [...] }, key2: { [...] }, [...] } 我得到的所有答案都建议使用fromJson(…)的预定义模型类直接映射到PODOs 然而,这个JSON是用于翻译字符串的,而且非常庞大。顶级键是语言代码,但它们可以有数百个条目,而次级键也有数百个条目,它们的名称可能随时更改,等等 有没

我有一个来自服务器的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