第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Flutter 使用來(lái)自 Golang RFC3339 的 DateTime 解析 json:

Flutter 使用來(lái)自 Golang RFC3339 的 DateTime 解析 json:

Go
縹緲止盈 2023-04-24 15:57:26
當(dāng)嘗試讀取在 Dart / Flutter 中使用 golangs json 包生成的 json 文件時(shí),我注意到解析日期會(huì)產(chǎn)生錯(cuò)誤:FormatException: Invalid date format一個(gè)示例是在 Go 服務(wù)器上生成的以下 json:{    ...    "dateCreated": "2018-09-29T19:51:57.4139787-07:00",    ...}我正在使用代碼生成方法進(jìn)行 json(反)序列化,以避免編寫所有樣板代碼。json_serializable 包是可用于此目的的標(biāo)準(zhǔn)包。所以我的代碼如下所示:@JsonSerializable()class MyObj {  DateTime dateCreated;  MyObj( this.dateCreated);  factory MyObj.fromJson(Map<String, dynamic> json) => _$MyObjFromJson(json);    Map<String, dynamic> toJson() => _$MyObjToJson(this); }
查看完整描述

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。


查看完整回答
反對(duì) 回復(fù) 2023-04-24
?
泛舟湖上清波郎朗

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);

}


查看完整回答
反對(duì) 回復(fù) 2023-04-24
  • 2 回答
  • 0 關(guān)注
  • 310 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)