2 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
因?yàn)槲臋n沒有充分涵蓋這一點(diǎn),所以我花了一天時(shí)間研究顫動(dòng)源和不同事物的反復(fù)試驗(yàn)來(lái)解決它。所以不妨分享一下。
Golang 默認(rèn)情況下在序列化為 Json 時(shí)在 RFC3339 中編碼 time.Time(如在給定的示例中)。Flutter 明確支持 RFC3339,為什么它不起作用?答案是秒小數(shù)部分的支持方式略有不同。雖然 Golang 產(chǎn)生 7 位數(shù)字的精度,但 Dart 最多只支持 6 位數(shù)字并且不會(huì)優(yōu)雅地處理違規(guī)情況。因此,如果將示例更正為只有 6 位精度,它將在 Dart 中解析得很好:
{
...
"dateCreated": "2018-09-29T19:51:57.413978-07:00",
...
}
為了以通用的方式解決這個(gè)問(wèn)題,您有兩個(gè)選擇:1. 從字符串中截?cái)囝~外的精度,或者 2. 實(shí)現(xiàn)您自己的解析。假設(shè)我們擴(kuò)展DateTime類并創(chuàng)建您自己的CustomDateTime. 新類重寫了parse方法,在將其交給父類的解析方法之前刪除 6 位數(shù)字后的所有多余部分。
現(xiàn)在我們可以在我們的 Dart 類中使用了CustomDateTime。例如:
@JsonSerializable()
class MyObj {
CustomDateTime dateCreated;
MyObj( this.dateCreated);
factory MyObj.fromJson(Map<String, dynamic> json) => _$MyObjFromJson(json);
Map<String, dynamic> toJson() => _$MyObjToJson(this);
}
但是當(dāng)然現(xiàn)在代碼生成被破壞了,我們得到以下錯(cuò)誤:
Error running JsonSerializableGenerator
Could not generate 'toJson' code for 'dateCreated'.
None of the provided 'TypeHelper' instances support the defined type.
幸運(yùn)的是,該json_annotation軟件包現(xiàn)在為我們提供了一個(gè)簡(jiǎn)單的解決方案 - The JsonConverter. 以下是如何在我們的示例中使用它:
首先定義一個(gè)轉(zhuǎn)換器,向代碼生成器解釋如何轉(zhuǎn)換我們的CustomDateTime類型:
class CustomDateTimeConverter implements JsonConverter<CustomDateTime, String> {
const CustomDateTimeConverter();
@override
CustomDateTime fromJson(String json) =>
json == null ? null : CustomDateTime.parse(json);
@override
String toJson(CustomDateTime object) => object.toIso8601String();
}
其次,我們只是將此轉(zhuǎn)換器注釋為使用我們的 CustomDateTime 數(shù)據(jù)類型的每個(gè)類:
@JsonSerializable()
@CustomDateTimeConverter()
class MyObj {
CustomDateTime dateCreated;
MyObj( this.dateCreated);
factory MyObj.fromJson(Map<String, dynamic> json) => _$MyObjFromJson(json);
Map<String, dynamic> toJson() => _$MyObjToJson(this);
}
這滿足了代碼生成器和 Voila!我們可以讀取帶有來(lái)自 golang time.Time 的 RFC3339 時(shí)間戳的 json。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
我有同樣的問(wèn)題。我找到了一個(gè)非常簡(jiǎn)單的解決方案。我們可以使用帶有 JsonConverter 的自定義轉(zhuǎn)換器。
import 'package:json_annotation/json_annotation.dart';
class CustomDateTimeConverter implements JsonConverter<DateTime, String> {
? const CustomDateTimeConverter();
? @override
? DateTime fromJson(String json) {
? ? if (json.contains(".")) {
? ? ? json = json.substring(0, json.length - 1);
? ? }
? ? return DateTime.parse(json);
? }
? @override
? String toJson(DateTime json) => json.toIso8601String();
}
import 'package:json_annotation/json_annotation.dart';
import 'package:my_app/shared/helpers/custom_datetime.dart';
part 'publication_document.g.dart';
@JsonSerializable()
@CustomDateTimeConverter()
class PublicationDocument {
? final int id;
? final int publicationId;
? final DateTime publicationDate;
? final DateTime createTime;
? final DateTime updateTime;
? final bool isFree;
? PublicationDocument({
? ? this.id,
? ? this.publicationId,
? ? this.publicationDate,
? ? this.createTime,
? ? this.updateTime,
? ? this.isFree,
? });
? factory PublicationDocument.fromJson(Map<String, dynamic> json) =>
? ? ? _$PublicationDocumentFromJson(json);
? Map<String, dynamic> toJson() => _$PublicationDocumentToJson(this);
}
- 2 回答
- 0 關(guān)注
- 310 瀏覽
添加回答
舉報(bào)