首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将JSON从对象序列化到字符串/ DateOnly

将JSON从对象序列化到字符串/ DateOnly
EN

Stack Overflow用户
提问于 2022-02-07 15:26:21
回答 4查看 6K关注 0票数 8

我有一个来自对象的JSON调用:

代码语言:javascript
复制
 public record SaveDate(DateOnly StartDate, string EndDate, Object[] objects);
代码语言:javascript
复制
var saveDate= new SaveDate(DateOnly.MinValue, DateTime.MaxValue.ToString("yyyy-MM-dd"), 
new Object[] { objects});

当执行API调用时,它将返回

代码语言:javascript
复制
{
    "startDate": {
        "year": 1,
        "month": 1,
        "day": 1,
        "dayOfWeek": 1,
        "dayOfYear": 1,
        "dayNumber": 0
    },
    "endDate": "2022-07-07",
    "Object": [
        {
            "foo": "bar"
                }
            ]
        }
    ]
}

但是,我需要让从startDate发送的格式与endDate (“yyyy”)相同,而不是反序列化版本。我怎么能这么做?

注意:我使用DateOnly作为类型(.net 6.0),API需要一个字符串,格式为上面指定的格式。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-02-07 16:10:23

DateOnlyTimeOnly绑定并不完全支持现在还没有。您可以为这种类型实现自己的转换器:

代码语言:javascript
复制
public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
    private const string Format = "yyyy-MM-dd";

    public override DateOnly ReadJson(JsonReader reader,
        Type objectType,
        DateOnly existingValue,
        bool hasExistingValue,
        JsonSerializer serializer) =>
        DateOnly.ParseExact((string)reader.Value, Format, CultureInfo.InvariantCulture);

    public override void WriteJson(JsonWriter writer, DateOnly value, JsonSerializer serializer) => 
        writer.WriteValue(value.ToString(Format, CultureInfo.InvariantCulture));
}

class MyClass
{
    [JsonConverter(typeof(DateOnlyJsonConverter))]
    public DateOnly dt { get; set; }
}

// prints {"dt":"2021-01-01"}
Console.WriteLine(JsonConvert.SerializeObject(new MyClass{dt = new DateOnly(2021,1,1)})); 

关于System.Text.Json -见这个答案

UPD

最近发布了13.0.2版的Newtonsoft.Json 支座 DateOnlyTimeOnly

13.0.2 新特性-添加对DateOnly和TimeOnly的支持

票数 13
EN

Stack Overflow用户

发布于 2022-06-14 07:37:41

对于.NET 6,我不得不稍微更新古古斯特伦的答案:

代码语言:javascript
复制
public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
    private const string Format = "yyyy-MM-dd";

    public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateOnly.ParseExact(reader.GetString(), Format, CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(Format, CultureInfo.InvariantCulture));
    }
}

用法相同:

代码语言:javascript
复制
class MyClass
{
    [JsonConverter(typeof(DateOnlyJsonConverter))]
    public DateOnly dt { get; set; }
}
票数 12
EN

Stack Overflow用户

发布于 2022-02-25 13:58:16

我在正在做的F#项目中遇到了这个问题。这是F#等价的

代码语言:javascript
复制
type DateOnlyJsonConverter() =
    inherit JsonConverter<DateOnly>()
    let format = "yyyy-MM-dd"

    override this.WriteJson(writer: JsonWriter, value: DateOnly, _: JsonSerializer): unit =
        writer.WriteValue(value.ToString(format, CultureInfo.InvariantCulture))

    override this.ReadJson(reader, _, _, _, _) =
        DateOnly.ParseExact(reader.Value :?> string, format, CultureInfo.InvariantCulture)
        
type TimeOnlyJsonConverter() =
    inherit JsonConverter<TimeOnly>()
    let format = "HH:mm:ss.FFFFFFF"

    override this.WriteJson(writer: JsonWriter, value: TimeOnly, _: JsonSerializer): unit =
        writer.WriteValue(value.ToString(format, CultureInfo.InvariantCulture))
    override this.ReadJson(reader, _, _, _, _) =
        TimeOnly.ParseExact(reader.Value :?> string, format, CultureInfo.InvariantCulture)

使用方法:

代码语言:javascript
复制
type Person = {
  Name: string
  BirthDate: DateOnly
}

let json = JsonConvert.SerializeObject(person, Formatting.None, DateOnlyJsonConverter())
(* result:
  { "name": "Ken", "birthDate": "1987-05-20" }
*)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71021064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档