如何解决如果将来添加任何键,json 如何解析颤振中的动态键和值
我收到了最初获得不同形状属性的响应。
{
"success": true,"data": {
"pcode": "001","pname": "ABC","pprice": "100"
"ones": [{
"id": "2","username": "LM10002"
},{
"id": "6","username": "LM10006"
}
],"twos": [{
"id": "3","username": "LM10003"
},{
"id": "8","username": "LM10008"
}
],]
}
}
这里的“ones”、“twos” .. 是动态键,将来也添加新数组。 所以我们可以在颤振中动态管理它?
解决方法
我的第一个建议是使用数字而不是字符串来转换这些数据,所以无论标签(ones
、twos
等...)在未来发生变化,它都赢了不会影响您的代码。
void main() {
final data = {
"success": true,"data": {
"ones": [
{ "id": "2","username": "LM10002" },{ "id": "6","username": "LM10006" }
],"twos": [
{ "id": "3","username": "LM10003" },{ "id": "8","username": "LM10008" }
]
}
};
print(ApiResponse.fromJson(data));
}
class ApiResponse {
final bool success;
final List<List<Data>> data;
ApiResponse({this.success,this.data});
factory ApiResponse.fromJson(Map<String,dynamic> json) {
List<List<Data>> dataList = [];
final jsonData = (json["data"] as Map<String,dynamic>);
jsonData.values.forEach((value) {
List<Data> parsedList = List<Data>.from(List.from(value).map((element) => Data.fromJson(element)));
dataList.add(parsedList);
});
return ApiResponse(
success: json["success"],data: dataList,);
}
@override
String toString() {
return "Success: $success,Data: ${data.map((element) => element.map((d) => "${d.id} ${d.username}")).toList().join("; ")}";
}
}
class Data {
final String id;
final String username;
Data({this.id,this.username});
factory Data.fromJson(Map<String,dynamic> json) {
return Data(
id: json["id"],username: json["username"],);
}
}
这应该返回一个数据列表,其中每个 index+1
将代表顺序(一个或两个,等等),并且附加的值将直接是数据列表。
主函数中的打印语句将打印:Success: true,Data: (2 LM10002,6 LM10006); (3 LM10003,8 LM10008)
。
第二种方法是为每个数据添加一个 group
属性,以便对于每个数据,您知道它属于哪个组(ones、twos 等...)
这是完整的实现
void main() {
final data = {
"success": true,"username": "LM10008" }
]
}
};
print(ApiResponse.fromJson(data));
}
class ApiResponse {
final bool success;
final List<Data> data;
ApiResponse({this.success,dynamic> json) {
List<Data> dataList = [];
final jsonData = (json["data"] as Map<String,dynamic>);
jsonData.forEach((key,value) {
List<Data> parsedList = List<Data>.from(List.from(value).map((element) {
element["group"] = key;
return Data.fromJson(element);
}));
dataList.addAll(parsedList);
});
return ApiResponse(
success: json["success"],);
}
@override
String toString() {
return "Success: $success,Data: ${data.map((element) => "${element.id},${element.username},${element.group}")}";
}
}
class Data {
final String id;
final String username;
final String group;
Data({this.id,this.username,this.group});
factory Data.fromJson(Map<String,group: json["group"]
);
}
}
main 方法中的打印语句应该打印:Success: true,Data: (2,LM10002,ones,6,LM10006,3,LM10003,twos,8,LM10008,twos)
总而言之,第一个解决方案建议以矩阵的形式表示数据,纵坐标为数据“组”的索引 1,横坐标为数据本身。
优点:我们保持数据的顺序并且很容易对它们进行排序 缺点:可读性不好,API返回的组标签是
第二种方法允许将标签保留为字符串并将它们添加到数据中(以便稍后根据组自动过滤数据)。
优势:我们保留初始数据组标签 缺点:排序会比较困难。
希望我提出的其中一种解决方案可以帮助到您。如果您需要更多说明,请随时告诉我。
快乐编码!
,您可以创建一个类来处理这种响应。您将能够访问分配给数据键的地图的不同键并对其执行任何您想要的操作。
OpenSSLEngineFactory
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。