c# 返回 iso 日期时间而不是 json 日期时间

问题描述 投票:0回答:2

我有两个项目,一个是服务器,另一个是调用者。我的服务器正在从其函数返回一个对象,当调用者收到结果时,它会以 json 形式接收数据。

班级

public class MyClass
{
    public int myInt{ get; set; }
    public string myString{ get; set; }
    public DateTime myDate{ get; set; }
}

服务器端

[HttpPost]
public async Task<ActionResult> Index()
{
     var tmpResult = await . . .
     return new MyClass();
}

来电侧

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = "POST";
Stream dataStream = webRequest.GetRequestStream();
WebResponse response = webRequest.GetResponse();
dataStream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(dataStream))
{
     responseFromServer = reader.ReadToEnd();
     reader.Close();
}

目前,我的回复是这样的:

{"myInt":0,"myString":"a","myDate":"/日期(1531908040342)/"}

我想要实现的目标是:

{"myInt":0,"myString":"a","myDate":"2018-07-18 00:00:00.000"}

我认为通过将 JsonConverter 添加到我的类中,它可以解决我的问题。

public class MyClass
{
    public int myInt{ get; set; }
    public string myString{ get; set; }

    [JsonConverter(typeof(CustomDateTimeConverter))]
    public DateTime myDate{ get; set; }
}

class CustomDateTimeConverter : IsoDateTimeConverter
{
    public CustomDateTimeConverter()
    {
        base.DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff";
    }
}

但是,我得到的回应仍然是一样的。我想知道我应该如何改变我的模型才能实现这一目标?或者我应该将我的响应转换为对象,然后再次重新序列化?

*补充:我希望我不需要输入类似

DateTime.ToString()
之类的内容。因为这样,我需要将我的响应转换为对象,然后将其一一输入。我希望我能得到的是来自服务器的响应,已经将其转换为 ISO 格式而不是 Json 格式

c# json asp.net-mvc-4
2个回答
0
投票

尝试使用此设置将对象转换为 JSON:

var settings = new JsonSerializerSettings
{
    DateFormatHandling = DateFormatHandling.IsoDateFormat
};

string json = JsonConvert.SerializeObject(data, settings);

https://www.newtonsoft.com/json/help/html/SerializeDateFormatHandling.htm


0
投票

您可以通过添加转换器来处理读写。并使用 AddJsonOptions 将其添加到 Program.cs 中。

处理程序类:

/// <summary>
/// Read (incomming) and write (outgoing) DateTime in JSON as ISO 8601 strings
/// </summary>
public class JsonIsoDateTimeConverter : JsonConverter<DateTime>
{
    private const string IsoFormat = "yyyy-MM-ddTHH:mm:ss.fffffffZ";

    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToUniversalTime().ToString(IsoFormat));
    }
}

在Program.cs中指定使用:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new JsonIsoDateTimeConverter());
    });

这个自定义 JsonIsoDateTimeConverter 是一个 JsonConverter,可以转换 IsoFormat 中的所有 DateTime。

© www.soinside.com 2019 - 2024. All rights reserved.