我需要修改json (Map)。需要更新值、添加新值等等。但是问题是:如果我试图添加(或更新)的新值不是相同类型的实际值或字符串,它会抛出一个异常.
是否有方法插入或修改具有新类型值的json?
(在C#和newtonsoft中,或者在NodeJs中,我可以轻松地完成它)
这是再现问题的代码:
void main() {
Map<String, dynamic> _json = {
'key 1': 'value 1',
'key 2': 'value 2',
'key 3': {
'key 3_1': {
'key 3_1_1': 'value 3.1.1'
}
},
'key 4': {
'key 4.1': {
'key 4.1.1': 'value 4.1.1'
}
},
'key 5': 4,
'key 6': true
};
(_json['key 3']['key 3_1'] as Map<String, dynamic>).update('key 3_1_1', (v) => '4'); // <---- this works
(_json['key 3']['key 3_1'] as Map<String, dynamic>).update('key 3_1_1', (v) => 4); // <--- this does not work
(_json['key 3']['key 3_1'] as Map<String, dynamic>).putIfAbsent('key 3_1_2', () => 4); // <--- this does not work too
(_json['key 3']['key 3_1'] as Map<String, dynamic>).putIfAbsent('key 3_1_2', () => {'a': '4'}); // <--- this does not work
print(_json);
}发布于 2022-03-05 10:10:16
原因是您原来的"JSON“映射文字是输入的。例如,子表达式
{
'key 3_1_1': 'value 3.1.1'
}具有Map<String, String>类型,因为这是元素的明显类型,并且没有上下文类型覆盖它(如果有的话,上下文类型只是dynamic )。
如果您将原始代码编写为:
Map<String, dynamic> _json = {
'key 1': 'value 1',
'key 2': 'value 2',
'key 3': <String, dynamic>{
'key 3_1': <String, dynamic>{
'key 3_1_1': 'value 3.1.1'
}
},
'key 4': <String, dynamic>{
'key 4.1': <String, dynamic>{
'key 4.1.1': 'value 4.1.1'
}
},
'key 5': 4,
'key 6': true
};您将获得与JSON相同的效果--编码,然后解码(而且效率更高)。
发布于 2022-03-04 12:02:04
我找到办法了!
只需导入省道:在任何json操作之前转换并添加这一行:
_json = json.decode(json.encode(_json));我不知道为什么,但是将json内联转换与使用.创建一个新的json不同。
https://stackoverflow.com/questions/71350768
复制相似问题