如何在flutter中解析嵌套的JSON?

DAS*_*SH 5 json dart flutter flutter-dependencies

谁能告诉我如何在 flutter 中解析这个 JSON。我被困住了,我成功创建了类,但从解析方法中收到错误这是 JSON

{
    "btcinr": {
        "base_unit": "btc",
        "quote_unit": "inr",
        "low": "3001337.0",
        "high": "3145000.0",
        "last": "3107312.0",
        "type": "SPOT",
        "open": "3085453",
        "volume": "243.1121",
        "sell": "3114335.0",
        "buy": "3106628.0",
        "at": 1646663606,
        "name": "BTC/INR"
    }
}
Run Code Online (Sandbox Code Playgroud)

我被困住并出错的方法是

Future<List<Map<String, dynamic>>> fetchData() async {
    final response =
        await http.get(Uri.parse("https://api.wazirx.com/api/v2/tickers"));
    if (response.statusCode == 200) {
      final responseJson = json.decode(response.body);
      
    } else {
      throw Exception('Unexpected Error Occured!');
    }
  }
Run Code Online (Sandbox Code Playgroud)

此方法不完整,任何帮助将不胜感激,谢谢!

Sye*_*hdi 5

发布此嵌套 JSON 请求的示例以便更好地理解。该示例有一个列表RejectedModel,该模型中有一个嵌套模型Reject,下面的代码正在处理它。

得到了这种格式的 JSON 响应。


[
    {
        "id": 2,
        "service": 200,
        "reject": {
            "id": 8,
            "reason": "sample",
            "order_id": 2,
        }
    },
    {
        "id": 3,
        "service": 600,
        "reject": {
            "id": 12,
            "reason": "sample",
            "order_id": 2,
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

控制器类看起来像这样

class RejectedModel{
  int id;
  int service;
  Reject reject;
  RejectedModel({required this.id, required this.service, required this.reject});

  factory RejectedModel.fromJson (Map<String,dynamic>json){
    return RejectedModel(id: json['id'],
        service: json['service'],
        reject: Reject.fromJson(json['reject'])  );
  }
}
class Reject{
//this will handel nested object
    int id;
    String reason;
    int order_id;

    Reject({required this.id, required this.reason, required this.order_id,});

    factory Reject.fromJson (Map<String,dynamic>json){
      return Reject(id: json['id'],
          reason: json['reason'],
          order_id: json['order_id']);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此方法中进行 API 调用。Future<List<RejectedModel>>是以下方法的返回类型

Future getRejctedOrders() async {
    final response = await http.get(Uri.parse('your url'));

    if(response.statusCode == 200){
      List rejected = json.decode(response.body);
      return rejected.map((e) => RejectedModel.fromJson(e)).toList();
    }
    else{
      throw Exception('something wrong');
    }
}
Run Code Online (Sandbox Code Playgroud)

在小部件中使用此 API 调用来显示数据。<List<RejectedModel>>之前(和之后都写这个FutureBuilder

FutureBuilder <List<RejectedModel>> (
    future: getRejctedOrders,
    builder: (context,snapshot){
      if(snapshot.hasData){
        final List<RejectedModel>? data = snapshot.data;
        return ListView.builder(
          itemCount: data?.length,
          shrinkWrap: true,
          itemBuilder: (BuildContext context, int index){
            if(index.isNaN){
              return CircularProgressIndicator(color: Colors.grey,);
            }

            Reject rej = data![index].reject;
            //you can make the required widget
            return Text('data ${rej.reason}');

          },
        );
      }
      else{
        return CircularProgressIndicator(color: Colors.grey,);
      }
    },
  )
Run Code Online (Sandbox Code Playgroud)


sal*_*ler 3

我需要诚实地说,这是一个普遍的问题。但我会尽力按照我的理解来回答。如果你想创建一个json解析机制。您可以使用像本网站这样的代码生成方法。这会为您生成一个巨大的对象,但至少在解析信息之后,您可以获得一个对象来引用您需要的任何内容。


我从https://api.wazirx.com/api/v2/tickers得到了结果。把它放到上面的网站上。它在这里生成了代码。我无法在这里分享,因为它太大了:)

接下来您需要做的是:

Future<Autogenerated> fetchData() async {
    final response =
        await http.get(Uri.parse("https://api.wazirx.com/api/v2/tickers"));
    if (response.statusCode == 200) {
      final responseJson = json.decode(response.body);
      final autogenerated = Autogenerated.fromJson(responseJson);
      return autogenerated;
    } else {
      throw Exception('Unexpected Error Occured!');
    }
  }

Run Code Online (Sandbox Code Playgroud)