C# System.Text.Json自定义JsonConverter<;日期时间>。.Deserialize()未使用Read()方法
我在System.Text.Json和自定义日期时间格式方面遇到问题 我已经创建了一个自定义转换器,它在我的api项目中工作。 当我构建客户端时,我尝试使用同一个类,但是.Deserialize()方法不会调用我的类的DateTime属性的.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 =
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>支持添加到框架中:噢,上帝,我怎么没有看到那个?