我希望加载二维双精度数组类型的JSON数据。
如果我试图通过json.encode
这样做,类型将丢失。
所以,下面失败了:
import 'dart:convert';
main() {
var x = [[0.0,0.0]];
print(x.runtimeType); // List<List<double>>
x = json.decode( json.encode (x) ); // this line fails
}
带有错误信息:
类型'List
'不是类型'List
>'的子类型
如何在JSON数据加载时维护List<List<double>>
的类型?
我试过了:
x = json.decode( json.encode (x) ) as List<List<double>>;
类型'List
'不是类型'List
>'的子类型
x = List<List<double>>.from(json.decode( json.encode (x) ));
类型'List
'不是类型'List '的子类型
虽然我最初的帖子是用于2D数组,但我的实际问题是使用4D数组。
我最终创建了一个自定义类来处理这些:
class JsonArrayConversion {
static List<double> convertJson(List<dynamic> json) {
return json.map((e) => e as double).toList();
}
static List<List<double>> convertJson2(List<dynamic> json) {
return json.map((e) {
if (e is List<dynamic>) {
return convertJson(e);
} else {
return [] as List<double>;
}
}).toList();
}
static List<List<List<double>>> convertJson3(List<dynamic> json) {
return json.map((e) {
if (e is List<dynamic>) {
return convertJson2(e);
} else {
return [] as List<List<double>>;
}
}).toList();
}
static List<List<List<List<double>>>> convertJson4(List<dynamic> json) {
return json.map((e) {
if (e is List<dynamic>) {
return convertJson3(e);
} else {
return [] as List<List<List<double>>>;
}
}).toList();
}
}
对于原始帖子中的示例,解决方案变为:
x = JsonArrayConversion.convertJson2( json.decode( json.encode (x) ) );
很笨拙,但是很好用。
试试这个(从https://app.quicktype.io/)
import 'dart:convert';
class NumbersList {
NumbersList({
required this.numbers,
});
List<List<double>>? numbers;
factory NumbersList.fromJson(String str) => NumbersList.fromMap(json.decode(str));
String toJson() => json.encode(toMap());
factory NumbersList.fromMap(Map<String, dynamic> json) => NumbersList(
numbers: json["numbers"] == null ? null : List<List<double>>.from(json["numbers"].map((x) => List<double>.from(x.map((x) => x.toDouble())))),
);
Map<String, dynamic> toMap() => {
"numbers": numbers == null ? null : List<dynamic>.from(numbers!.map((x) => List<dynamic>.from(x.map((x) => x)))),
};
}
使用:
var jsonString = '{"numbers"[[1.0, 1,2],[2.5, 5、6]]}';最后numbersList = numbersList . fromjson (jsonString);打印(numbersList.toJson ());
或简单的:
var str = "[[1.0, 1, 2],[2.5, 5, 6]]";
var numbers = json.decode(str);
var n = List<List<double>>.from(numbers.map((x) => List<double>.from(x.map((x) => x.toDouble()))))