Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Text.Json自定义JsonConverter<;日期时间>。.Deserialize()未使用Read()方法_C#_Json_.net Core_System.text.json - Fatal编程技术网

C# System.Text.Json自定义JsonConverter<;日期时间>。.Deserialize()未使用Read()方法

C# System.Text.Json自定义JsonConverter<;日期时间>。.Deserialize()未使用Read()方法,c#,json,.net-core,system.text.json,C#,Json,.net Core,System.text.json,我在System.Text.Json和自定义日期时间格式方面遇到问题 我已经创建了一个自定义转换器,它在我的api项目中工作。 当我构建客户端时,我尝试使用同一个类,但是.Deserialize()方法不会调用我的类的DateTime属性的.Read() 有人经历过同样的问题吗 public class DateTimeConverter : JsonConverter<DateTime> { private static readonly string _format =

我在System.Text.Json和自定义日期时间格式方面遇到问题

我已经创建了一个自定义转换器,它在我的api项目中工作。 当我构建客户端时,我尝试使用同一个类,但是.Deserialize()方法不会调用我的类的DateTime属性的.Read()

有人经历过同样的问题吗

public class DateTimeConverter : JsonConverter<DateTime>
{
    private static readonly string _format = "yyyy-MM-dd'T'HH:mm:ss.fff";

    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.ParseExact(reader.GetString(), _format, System.Globalization.CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    => writer.WriteStringValue(value.ToUniversalTime().ToString(_format));
}

public async Task<StockUnitInfo> GetStockUnitInfoAsync(Inbound inbound, CancellationToken token = default)
{
    var uri = Uri.EscapeUriString($"{_httpClient.BaseAddress}/Readers/{inbound.Position}/StockUnits/{inbound.Barcode}");

    var test = await _httpClient.GetStringAsync(uri);

    var response = await _httpClient.GetStreamAsync(uri);

    var _serializationOptions = new JsonSerializerOptions
    {
        Converters = { new DateTimeConverter() }
    };

    return await JsonSerializer.DeserializeAsync<StockUnitInfo>(response, _serializationOptions, token);
}

public class StockUnitInfo
{
    public string barcode { get; set; }
    public string wms_batch_id { get; set; }
    public string gtin { get; set; }

    //[JsonConverter(typeof(DateTimeConverter))]
    public DateTime sort_date { get; set; }
    public string talleys_batch_number { get; set; }
    public int expected_batch_size { get; set; }
    public string destination { get; set; }
    public bool fast_mover { get; set; }
    public int stackable { get; set; }
    public string message { get; set; }
}
公共类DateTimeConverter:JsonConverter
{
私有静态只读字符串_format=“yyyy-MM-dd'T'HH:MM:ss.fff”;
公共覆盖日期时间读取(参考Utf8JsonReader reader,键入typeToConvert,JsonSerializerOptions选项)
{
return DateTime.ParseExact(reader.GetString(),_格式,System.Globalization.CultureInfo.InvariantCulture);
}
公共重写无效写入(Utf8JsonWriter编写器、日期时间值、JsonSerializerOptions选项)
=>writer.WriteStringValue(value.ToUniversalTime().ToString(_格式));
}
公共异步任务GetStockUnitInfo异步(入站,CancellationToken-token=default)
{
var uri=uri.EscapeUriString($“{httpClient.BaseAddress}/Readers/{inbound.Position}/StockUnits/{inbound.Barcode}”);
var test=await\u httpClient.GetStringAsync(uri);
var response=await\u httpClient.GetStreamAsync(uri);
var _serializationOptions=新的JSONSerializationOptions
{
转换器={new DateTimeConverter()}
};
return wait JsonSerializer.DeserializeAsync(响应,_serializationOptions,token);
}
公共类股票信息
{
公共字符串条形码{get;set;}
公共字符串wms_batch_id{get;set;}
公共字符串gtin{get;set;}
//[JsonConverter(类型(日期时间转换器))]
公共日期时间排序\u日期{get;set;}
公共字符串计数\u批次\u编号{get;set;}
public int需要批处理大小{get;set;}
公共字符串目标{get;set;}
公共布尔快速移动器{get;set;}
公共int可堆叠{get;set;}
公共字符串消息{get;set;}
}
要求的最小可复制示例:

using System;
using System.Text.Json;
using System.Text.Json.Serialization;

class Program
{
    public class DateTimeConverter : JsonConverter<DateTime>
    {
        //private static readonly string _format = "yyyy.MM.dd'T'HH:mm:ss.fff'Z'";  //formato api?
        private static readonly string _format = "yyyy-MM-dd'T'HH:mm:ss.fff";


        public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            return DateTime.ParseExact(reader.GetString(), _format, System.Globalization.CultureInfo.InvariantCulture);
        }

        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
        => writer.WriteStringValue(value.ToUniversalTime().ToString(_format));
    }
    public class StockUnitInfo
    {
        public string barcode { get; set; }
        public string wms_batch_id { get; set; }
        public string gtin { get; set; }

        //[JsonConverter(typeof(DateTimeConverter))]
        public DateTime sort_date { get; set; }
        public string talleys_batch_number { get; set; }
        public int expected_batch_size { get; set; }
        public string destination { get; set; }
        public bool fast_mover { get; set; }
        public int stackable { get; set; }
        public string message { get; set; }
    }
    public static void Main(string[] args)
    {
        string json = "{\"barcode\":\"201930823\",\"wmsBatchId\":\"c3e4d921-8779-46f7-ac28-b1f523845329\",\"gtin\":\"01080\",\"sortDate\":\"2019-09-20T11:59:59.999\",\"talleysBatchNumber\":\"STK0233\",\"expectedBatchSize\":1,\"destination\":\"5A05\",\"fastMover\":false,\"stackable\":0,\"message\":\"Pallet directed to CS4\"}";

        var _serializationOptions = new JsonSerializerOptions
        {
            Converters = { new DateTimeConverter() }
        };
        var result = JsonSerializer.Deserialize<StockUnitInfo>(json, _serializationOptions);

        Console.WriteLine(result.sort_date);
        Console.Read();
    }
}
使用系统;
使用System.Text.Json;
使用System.Text.Json.Serialization;
班级计划
{
公共类DateTimeConverter:JsonConverter
{
//私有静态只读字符串_format=“yyy.MM.dd'T'HH:MM:ss.fff'Z'”;//格式化api?
私有静态只读字符串_format=“yyyy-MM-dd'T'HH:MM:ss.fff”;
公共覆盖日期时间读取(参考Utf8JsonReader reader,键入typeToConvert,JsonSerializerOptions选项)
{
return DateTime.ParseExact(reader.GetString(),_格式,System.Globalization.CultureInfo.InvariantCulture);
}
公共重写无效写入(Utf8JsonWriter编写器、日期时间值、JsonSerializerOptions选项)
=>writer.WriteStringValue(value.ToUniversalTime().ToString(_格式));
}
公共类股票信息
{
公共字符串条形码{get;set;}
公共字符串wms_batch_id{get;set;}
公共字符串gtin{get;set;}
//[JsonConverter(类型(日期时间转换器))]
公共日期时间排序\u日期{get;set;}
公共字符串计数\u批次\u编号{get;set;}
public int需要批处理大小{get;set;}
公共字符串目标{get;set;}
公共布尔快速移动器{get;set;}
公共int可堆叠{get;set;}
公共字符串消息{get;set;}
}
公共静态void Main(字符串[]args)
{
字符串json=“{\'barcode\”:“201930823\”,“wmsBatchId\”:“c3e4d921-8779-46f7-ac28-b1f523845329\”,“gtin\”:“01080\”,“sortDate\”:“2019-09-20T11:59:59.999\”,“talleysBatchNumber\”:“STK0233\,“expectedBatchSize\”:1,“,“destination\”:“destination\”:“5A05\,“false\”,“false\”,“stackable\”,“Stockable\”,“stackable\”,“Stackboard\”,“Stackboard\”,“Stackboard\”,“Stackboard\”:“Stackboard\”,“Stackbo;
var _serializationOptions=新的JSONSerializationOptions
{
转换器={new DateTimeConverter()}
};
var result=JsonSerializer.Deserialize(json,_serializationOptions);
控制台写入线(结果排序日期);
Console.Read();
}
}

原因是类属性的名称和Json属性的名称不同:

“排序日期”:“2019-09-20T11:59:59.999”

public DateTime排序_date{get;set;}

为了反序列化该json,您需要使名称相同,或者通过添加一个属性告诉序列化程序要做什么,以告诉等效名称是什么:

//用于NewtonSoft.Json
//[JsonProperty(“sortDate”)]
//对于System.Text.Json
[JsonPropertyName(“sortDate”)]
公共日期时间排序\u日期{get;set;}
添加后,示例代码将正确运行:


能否提供一个不反序列化的Json示例?。。或者(更好的)准备好能说明问题的输入。在准备过程中,您可以自己解决问题。顺便说一句,谢谢您的建议,现在更清楚了吗?@stuartd示例是否足够?除了添加
JsonPropertyName
属性,您还可以考虑实现自己的<代码> JsonNamingPolicy <代码>,以支持SnaKeKEY案例,并将其设置为<代码> PropertyNamingPolicy <代码>中的<代码> JSONSerialIZErrases>代码>或等待<代码> SnakeCase < /Cord>支持添加到框架中:噢,上帝,我怎么没有看到那个?