我如何手动迭代和过滤json中的一些项目,这些项目可能包含数组,也可能不包含数组



在我的应用程序中,我创建了一个api类:


import 'package:http/http.dart' as http;
import 'dart:convert';
class Api 
{
final String __baseUrl = "https://api.example.com"
String? __token="";
Future<List Stores> login(String username, String password) async {
Uri url = Uri.parse(__base_url + "/login");
var response = await http.post(url, body: {
'email': email,
'password': password
}, headers: {
"Accept": "application/vnd.api.myapi.v3+json",
"Accept-Language": "en"
});

// I ommin status code checks for simplicity in question
var responseJson = json.decode(response.body);
__token = responseJson['tekken'];

var stores = responseJson['stores']
// Somehow filter and iterate the stores.
}
}

为了保持自己的控制和理智,我还制作了我自己的类统计图——我想要的基本数据:

class Store
{
final String id;
final String name;
const Store(this.id,this.name);
}

json的最终响应是:

{
"tekken":"cdasddfadadqa",
"stores":[
{
"id":"cfsdsafsddsfdsf",
"profile": [{"title":"Colomnian Store","lang":"en"},{"title":"Κολομβιανο χασίς","lang":"el"},]
"sels_drugs":true
},
{
"id":"cfsdsafsddsfdsf",
"profile": [{"title":"Kuma Bear","lang":"en"},{"title":"Αρκουδάκι","lang":"el"},]
"sels_drugs":false
}
]
}

我想要实现的是创建一个列表,其中包含使用类Store映射的存储。正如你所看到的,我想得到所提供数据的子集,所以像这样的答案不是我想要的。

如何手动迭代";商店";items通过sels_drugs键过滤为false并返回列表?

我可以做stores.where((u) => u.sells_drugs).toList().map()吗?此外,如果商店为空或没有项目,我想返回一个空列表,而不是炸毁我的应用程序。我该怎么做?

一种可以通过以下方式实现的方法:

如果将var存储放入nessseary列表中,则使用循环和经典if循环var存储:

var stores = responseJson['stores'];
List<Store> storesToReturn = [];
for(store in stores) {
if(store.sellsDrugs){
storesToReturn.add(Store(store.id, store['profile'][0]['title']));
}
}

所以最后一类是:

import 'package:http/http.dart' as http;
import 'dart:convert';
class Api 
{
final String __baseUrl = "https://api.example.com"
String? __token="";

// Some constructors here
Future<List<Store>> login(String username, String password) async {
Uri url = Uri.parse(__base_url + "/login");
var response = await http.post(url, body: {
'email': email,
'password': password
}, headers: {
"Accept": "application/vnd.api.myapi.v3+json",
"Accept-Language": "en"
});

// I ommin status code checks for simplicity in question
var responseJson = json.decode(response.body);
__token = responseJson['tekken'];

var stores = responseJson['stores']
List<Store> storesToReturn = [];
for(store in stores) {
if(store.sellsDrugs){
storesToReturn.add(Store(store.id, store['profile'][0]['title']));
}
}
return storesToReturn;
}
}

最新更新