繁体   English   中英

Flutter/Dart JSON 和现有库类的序列化

[英]Flutter/Dart JSON and serialization of an existing library class

我有一堂课:

import 'package:google_maps_flutter/google_maps_flutter.dart';

class Place {
  Place({
    this.address,
    this.coordinates,
  });

  final String address;
  final LatLng coordinates;
}

LatLng是一类google_maps_flutter 如何使用json_annotationjson_serializable使我的Place类可序列化?

非常感谢!

将此代码放入您的模型中

要从 JSON 响应中获取信息,只需在您的请求之后执行此操作

  1. 最终位置 = placeFromJson(response.body);
  2. 获取地址 => = place.address
  3. 获取坐标 => place.coordinates.lng , place.coordinates.lat

==============================================


import 'dart:convert';

Place placeFromJson(String str) => Place.fromJson(json.decode(str));

String placeToJson(Place data) => json.encode(data.toJson());

class Place {
    String address;
    Coordinates coordinates;

    Place({
        this.address,
        this.coordinates,
    });

    factory Place.fromJson(Map<String, dynamic> json) => Place(
        address: json["address"],
        coordinates: Coordinates.fromJson(json["coordinates"]),
    );

    Map<String, dynamic> toJson() => {
        "address": address,
        "coordinates": coordinates.toJson(),
    };
}

class Coordinates {
    String lat;
    String lng;

    Coordinates({
        this.lat,
        this.lng,
    });

    factory Coordinates.fromJson(Map<String, dynamic> json) => Coordinates(
        lat: json["lat"],
        lng: json["lng"],
    );

    Map<String, dynamic> toJson() => {
        "lat": lat,
        "lng": lng,
    };
}

您可以使用 JsonKey 注释显式指定应使用哪些 LatLng 方法进行序列化:

@JsonSerializable()
class Place {
  Place({
    this.address,
    this.coordinates,
  });

  final String address;
  @JsonKey(fromJson: LatLng.fromJson, toJson: jsonEncode)
  final LatLng coordinates;
}

我没有为此找到一个超级简单的解决方案。 最后,我为 LatLng 属性编写了一个自定义的 toJson/fromJson。 我已经将它静态地放到我的模型中,但是如果需要重用它,您也可以创建一个全局函数。

请注意,在我的示例中 LatLng 可以为空。

import 'dart:collection';
import 'dart:convert';

import 'package:latlong2/latlong.dart';

part 'challenge_model.g.dart';

@JsonSerializable()
class ChallengeModel with _$ChallengeModel {
  ChallengeModel({
    required this.startPosition,
  });

  @override
  @JsonKey(fromJson: latLngFromJson, toJson: latLngToJson)
  final LatLng? startPosition;

  /// Create [ChallengeModel] from a json representation
  static fromJson(Map<String, dynamic> json) => _$ChallengeModelFromJson(json);

  /// Json representation
  @override
  Map<String, dynamic> toJson() => _$ChallengeModelToJson(this);

  static String latLngToJson(LatLng? latLng) =>
      jsonEncode(latLng != null ? {'latitude': latLng.latitude, 'longitude': latLng.longitude} : null);

  static LatLng? latLngFromJson(String jsonString) {
    final LinkedHashMap<String, dynamic>? jsonMap = jsonDecode(jsonString);

    return jsonMap != null ? LatLng(jsonMap['latitude'], jsonMap['longitude']) : null;
  }
}

暂无
暂无

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

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