繁体   English   中英

将 JSON 解析为 Dart Object 在 ZC047B10EEE763AFCCB6864E077ZCF1

[英]Parse JSON to Dart Object in Flutter

我是 Flutter 的新手,对复杂的 JSON 解析知之甚少。 我查阅了几篇在线文章,但没有找到任何适合该案例的解决方案。 我的 JSON 如下:

{
   "RIFUSD":[
      {
         "timestamp":"2021-02-13T16:00:00.000Z",
         "open":"0.3257370",
         "close":"0.3257370",
         "min":"0.3257370",
         "max":"0.3257370",
         "volume":"49",
         "volumeQuote":"15.9611130"
      },
      {
         "timestamp":"2021-02-13T12:00:00.000Z",
         "open":"0.3015120",
         "close":"0.3216128",
         "min":"0.3015120",
         "max":"0.3216768",
         "volume":"4079",
         "volumeQuote":"1298.0319504"
      }
   ],
   "BERRYUSD":[
      {
         "timestamp":"2021-02-13T04:00:00.000Z",
         "open":"0.00061800",
         "close":"0.00061780",
         "min":"0.00061000",
         "max":"0.00071783",
         "volume":"10460",
         "volumeQuote":"6.89477840"
      },
      {
         "timestamp":"2021-02-12T20:00:00.000Z",
         "open":"0.00060489",
         "close":"0.00061800",
         "min":"0.00048829",
         "max":"0.00061800",
         "volume":"466690",
         "volumeQuote":"228.12405820"
      }
   ]
}

和我的蜡烛 Class 保持时间戳,打开,关闭,最小,最大,体积和体积报价:

class Candle {
  Candle({
    this.timestamp,
    this.open,
    this.close,
    this.min,
    this.max,
    this.volume,
    this.volumeQuote,
  });

  final DateTime timestamp;
  final String open;
  final String close;
  final String min;
  final String max;
  final String volume;
  final String volumeQuote;

  factory Candle.fromRawJson(String str) => Candle.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory Candle.fromJson(Map<String, dynamic> json) => Candle(
        timestamp: json["timestamp"] == null
            ? null
            : DateTime.parse(json["timestamp"]),
        open: json["open"] == null ? null : json["open"],
        close: json["close"] == null ? null : json["close"],
        min: json["min"] == null ? null : json["min"],
        max: json["max"] == null ? null : json["max"],
        volume: json["volume"] == null ? null : json["volume"],
        volumeQuote: json["volumeQuote"] == null ? null : json["volumeQuote"],
      );

  Map<String, dynamic> toJson() => {
        "timestamp": timestamp == null ? null : timestamp.toIso8601String(),
        "open": open == null ? null : open,
        "close": close == null ? null : close,
        "min": min == null ? null : min,
        "max": max == null ? null : max,
        "volume": volume == null ? null : volume,
        "volumeQuote": volumeQuote == null ? null : volumeQuote,
      };
 }

我想将此 JSON 解析为:

class CandleList {
  CandleList({
    this.candleList,
    this.symbol,
  });

  final List<Candle> candleList;
  final Sym symbol;

  factory CandleList.fromRawJson(String str) =>
      CandleList.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory CandleList.fromJson(Map<String, dynamic> json) => CandleList(
        candleList: json["candleList"] == null
            ? null
            : List<Candle>.from(
                json["candleList"].map((x) => Candle.fromJson(x))),
        symbol: json["symbol"] == null ? null : Sym.fromJson(json["symbol"]),
      );

  Map<String, dynamic> toJson() => {
        "candleList": candleList == null
            ? null
            : List<dynamic>.from(candleList.map((x) => x.toJson())),
        "symbol": symbol == null ? null : symbol.toJson(),
      };

  @override
  String toString() {
    return '${symbol.id} > ${candleList.length} Candles';
  }
}

使用 List 和 "RIFUSD","BERRYUSD" 作为 CandleList class 的CandleList

First of all, install the HTTP package in Flutter, and after that import HTTP package like the below code:

import 'package:http/http.dart' as HTTP;

然后你必须创建一个 map 或一个列表:

  Map<int, FavoriteModel> _favoites = {};

  Map<int, FavoriteModel> get favoitesItem {
    return _favoites;
  }

然后你可以获取你的数据:

Future<void> getFavoriteList({
  @required int userId,
}) async {
  try {
    final response = await http.get("your url");
    final extractedData = json.decode(response.body);
    if (extractedData == null) {
      return;
    }
    final Map<int, YourModel> loadedProducts = {};

    print("Mahdi: favorite food ${extractedData['RIFUSD']}");

    final lastExtract = extractedData['RIFUSD'];

    lastExtract.forEach((prodData) {
      loadedProducts.putIfAbsent(
        prodData['timestamp'],
            () => YourModel(
          timestamp: prodData['timestamp'],
          open: prodData['open'],
        ),
      );
    });

    _favoites = loadedProducts;
    print("Mahdi ${_favoites.length}");
  } catch (error) {
    print("Mahdi E: $error");
    throw (error);
  }
}

我希望这对你有用

数据/raw_data_1.dart

const rawData = '''
{
   "RIFUSD":[
      {
   ....
      }
   ]
}
''';

main.dart

import 'dart:convert';

import 'data/raw_data_1.dart';


class NetService {
  static Future<Map<String, Object>> fetchData() {
    return Future.delayed(Duration(seconds: 2), () => rawData)
      .then((response) => jsonDecode(response));
  }
}

main(List<String> args) async {
  var data = await NetService.fetchData();
  var globalData = GlobalData.fromJson(data);
  print(globalData.data[0].id);
  print(globalData.data[0].candles[0].timestamp_UTC.toLocal().toString());
  print(globalData.data[0].candles[0].open.toString());
  print(globalData.data[0].candles[0].close.toString());
  print(globalData.data[0].candles[0].min.toString());
  print(globalData.data[0].candles[0].max.toString());
  print(globalData.data[0].candles[0].volume.toString());
  print(globalData.data[0].candles[0].volumeQuote.toString());
}

class Candle {
  DateTime timestamp_UTC;
  double open, close, min, max, volumeQuote;
  int volume;

  Candle.fromJson(Map<String, Object> jdata) {
    timestamp_UTC = DateTime.tryParse(jdata['timestamp']);
    open = double.tryParse(jdata['open']);
    close = double.tryParse(jdata['close']);
    min = double.tryParse(jdata['min']);
    max = double.tryParse(jdata['max']);
    volume = int.tryParse(jdata['volume']);
    volumeQuote = double.tryParse(jdata['volumeQuote']);
  }
}

class EntryOA {
  String id;
  List<Candle> candles;

  EntryOA.fromJson(MapEntry<String, Object> jdata) {
    this.id = jdata.key;
    var list = jdata.value as List<Object>;
    this.candles = List<Candle>.generate(list.length, (i) => Candle.fromJson(list[i] as Map<String, Object>));
  }
}

class GlobalData {
  List<EntryOA> data;
  
  GlobalData.fromJson(Map<String, Object> jdata) {
    data = jdata.entries.map((me) => EntryOA.fromJson(me)).toList();
  }
}

结果:

RIFUSD
2021-02-13 11:00:00.000
0.325737
0.325737
0.325737
0.325737
49
15.961113

您不需要手动编写 dart 文件。 您可以使用在线工具,例如将 JSON 响应转换为 Dart 我试了一下,下面是 Dart class 用于您的 JSON 响应。

class Model_Candle {
  List<RIFUSD> rIFUSD;
  List<BERRYUSD> bERRYUSD;

  Model_Candle({this.rIFUSD, this.bERRYUSD});

  Model_Candle.fromJson(Map<String, dynamic> json) {
    if (json['RIFUSD'] != null) {
      rIFUSD = new List<RIFUSD>();
      json['RIFUSD'].forEach((v) {
        rIFUSD.add(new RIFUSD.fromJson(v));
      });
    }
    if (json['BERRYUSD'] != null) {
      bERRYUSD = new List<BERRYUSD>();
      json['BERRYUSD'].forEach((v) {
        bERRYUSD.add(new BERRYUSD.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.rIFUSD != null) {
      data['RIFUSD'] = this.rIFUSD.map((v) => v.toJson()).toList();
    }
    if (this.bERRYUSD != null) {
      data['BERRYUSD'] = this.bERRYUSD.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class RIFUSD {
  String timestamp;
  String open;
  String close;
  String min;
  String max;
  String volume;
  String volumeQuote;

  RIFUSD(
      {this.timestamp,
      this.open,
      this.close,
      this.min,
      this.max,
      this.volume,
      this.volumeQuote});

  RIFUSD.fromJson(Map<String, dynamic> json) {
    timestamp = json['timestamp'];
    open = json['open'];
    close = json['close'];
    min = json['min'];
    max = json['max'];
    volume = json['volume'];
    volumeQuote = json['volumeQuote'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['timestamp'] = this.timestamp;
    data['open'] = this.open;
    data['close'] = this.close;
    data['min'] = this.min;
    data['max'] = this.max;
    data['volume'] = this.volume;
    data['volumeQuote'] = this.volumeQuote;
    return data;
  }
}

现在要访问 RIFUSD 的值,您可以编写如下代码

 final Map<String, dynamic> parsed = await wrapper.get_CategoryFull(catid);
final model = get_model_category.fromJson(parsed);
if (model.RIFUSD.length > 0) {
      for (int i = 0; i < model.RIFUSD.length; i++) {
        print( "timespamt "+ model.RIFUSD[i].timestamp.tostring() );
      }

    } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM