【发布时间】:2021-07-30 19:33:36
【问题描述】:
我有一个来自服务器的json响应,格式如下......
{
key1: {
subKey1: value1
subKey2: value2
[...]
},
key2: {
[...]
},
[...]
}
我遇到的所有答案都建议使用带有 fromJson(...) 的预定义模型类直接映射到 PODO。
但是,这个 JSON 是用于翻译字符串的,而且非常庞大。顶级键是语言代码,但可以是数百个条目,子级键也有数百个,并且它们的名称可能随时更改等。
没有一个简单的方法可以从 Map
我试过了
Map<String, Map<String, String> typedMap = jsonResponse.map((key, value) => MapEntry(key, value))
但我被告知格式不匹配。
这是根据建议编辑的输出,
首先是完整的示例代码... Get.find 来自用于状态管理的 GetX 包。它在项目的其他领域工作得很好。
class TranslationsService {
final logger = getLogger('Translation Service');
Future<Map<String, Map<String, String>>> getTranslations() async {
var response = await http.get(
[url]);
if (response.statusCode == HttpStatus.ok) {
var jsonResponse =
convert.json.decode(response.body) as Map<String, dynamic>;
Map<String, Map<String, String>> result = jsonResponse
.map((key, value) => MapEntry(key, value as Map<String, String>));
logger.i(result);
return result;
} else {
logger.e('Request failed with status code ${response.statusCode}');
return null;
}
}
static Future load() async {
final api = TranslationsService();
Map<String, Map<String, String>> map = await api.getTranslations();
Get.find<TranslatedStrings>().map = map;
}
}
还有输出,现在填充的错误更多......
E/flutter (26806): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Map<String, String>' in type cast
E/flutter (26806): #0 TranslationsService.getTranslations.<anonymous closure>
package:dream_x/services/translations_service.dart:19
E/flutter (26806): #1 MapMixin.map (dart:collection/maps.dart:170:28)
E/flutter (26806): #2 TranslationsService.getTranslations
package:dream_x/services/translations_service.dart:19
E/flutter (26806): <asynchronous suspension>
[....]
I/example.dream_(26806): Waiting for a blocking GC ProfileSaver
我在这里可能很愚蠢,但是转换一个简单的地图似乎过于复杂..... :D
而且,正如证明我得到的响应不是侥幸一样,这里是带有临时截断文件的 jsonResponse 打印的完整输出,使用 JSON Formatter 格式化和验证:
{
"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"
}
}
【问题讨论】: